﻿package org.rkuk.kasutil.timeline.conditions 
{
	import org.rkuk.kasutil.designPatternTools.AbstractTool;
	import org.rkuk.kasutil.timeline.ITicker;
	import org.rkuk.kasutil.timeline.ITickInfo;
	import org.rkuk.kasutil.timeline.Timeline;
	/**
	 * 用于将多个ITickerUpdateCondition条件进行逻辑运算.
	 * LogicCondition是抽象类，实现了添加和删除需要进行逻辑运行的ITickerUpdateCondition，
	 * 具体的多个条件之间要完成怎样的逻辑运行，需要通过override isNeedUpdate方法来实现。
	 * @author rkuk
	 */
	public class LogicCondition implements ITickerUpdateCondition
	{
		/**
		 * 保存了需要进行逻辑运行的多个ITickerUpdateCondition对象
		 */
		protected var _conditions:Vector.<ITickerUpdateCondition>;
		
		/**
		 * @private
		 */
		public function LogicCondition() 
		{
			AbstractTool.makeAbstractClass(this, org.rkuk.kasutil.timeline.conditions.LogicCondition);
			init();
		}
		
		private function init():void
		{
			_conditions = new Vector.<ITickerUpdateCondition>();
		}
		
		/* INTERFACE org.rkuk.kasutil.timeline.conditions.ITickerUpdateCondition */
		
		/**
		 * 子类中需要override此方法实现多个条件的逻辑运算,并返回运算的结果以确定刷新条件.
		 * @param	timeline	发出刷新信号的Timeline对象
		 * @param	ticker		可能将要被刷新的ITicker对象
		 * @param	tickInfo	Timeline发出刷新信号时的时间信息
		 * @return	true表示ITicker需要被刷新，false表示ITicker不需要被刷新
		 */
		public function isNeedUpdate(timeline:Timeline,ticker:ITicker, tickInfo:ITickInfo):Boolean
		{
			return AbstractTool.makeAbstractMethod(this, "isNeedUpdate");
		}
		
		/**
		 * 添加条件进行逻辑组合
		 * @param	condition	被添加的ITickerUpdateCondition
		 * @return	条件是否添加成功
		 */
		public function addCondition(condition:ITickerUpdateCondition):Boolean
		{
			if (condition != null && _conditions.indexOf(condition) == -1)
			{
				_conditions.push(condition);
				return true;
			}
			
			return false;
		}
		
		/**
		 * 删除条件
		 * @param	condition	被删除的ITickerUpdateCondition
		 * @return	是否删除条件成功
		 */
		public function removeCondition(condition:ITickerUpdateCondition):Boolean
		{
			if (condition != null)
			{
				var index:int = _conditions.indexOf(condition);
				if (index != -1)
				{
					_conditions.splice(index, 1);
					return true;
				}
			}
			
			return false;
		}
		
		/**
		 * 当没有添加ITickerUpdateCondition时无法进行逻辑运算，则返回此默认值
		 */
		public static var defaultConditionResult:Boolean = true;
	}
}